把第一個練習中的代碼在X86-64(Ubuntu)中反彙編,給出彙編代碼和機器碼的截圖html
把X86-64彙編翻譯成Y86-64彙編,並給出相應機器碼的截圖(使用附件中的Y86-64模擬器)java
C語言代碼:git
#include <stdlib.h> #include <stdio.h> int main(int argc,char *argv[]) { int i,sum=0; for(i=0;i<argc;i++) { sum+=atoi(argv[i]); } printf("Total: %d\n",sum); return 0; }
X86-64彙編:算法
.file "sum.c" .section .rodata .LC0: .string "Total: %d\n" .text .globl main .type main, @function main: .LFB2: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $32, %rsp movl %edi, -20(%rbp) movq %rsi, -32(%rbp) movl $0, -4(%rbp) movl $0, -8(%rbp) jmp .L2 .L3: movl -8(%rbp), %eax cltq leaq 0(,%rax,8), %rdx movq -32(%rbp), %rax addq %rdx, %rax movq (%rax), %rax movq %rax, %rdi call atoi addl %eax, -4(%rbp) addl $1, -8(%rbp) .L2: movl -8(%rbp), %eax cmpl -20(%rbp), %eax jl .L3 movl -4(%rbp), %eax movl %eax, %esi movl $.LC0, %edi movl $0, %eax call printf movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE2: .size main, .-main .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609" .section .note.GNU-stack,"",@progbits
X86-64機器碼:ubuntu
0000000000000000 <main>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 83 ec 20 sub $0x20,%rsp 8: 89 7d ec mov %edi,-0x14(%rbp) b: 48 89 75 e0 mov %rsi,-0x20(%rbp) f: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) 16: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%rbp) 1d: eb 26 jmp 45 <main+0x45> 1f: 8b 45 f8 mov -0x8(%rbp),%eax 22: 48 98 cltq 24: 48 8d 14 c5 00 00 00 lea 0x0(,%rax,8),%rdx 2b: 00 2c: 48 8b 45 e0 mov -0x20(%rbp),%rax 30: 48 01 d0 add %rdx,%rax 33: 48 8b 00 mov (%rax),%rax 36: 48 89 c7 mov %rax,%rdi 39: e8 00 00 00 00 callq 3e <main+0x3e> 3e: 01 45 fc add %eax,-0x4(%rbp) 41: 83 45 f8 01 addl $0x1,-0x8(%rbp) 45: 8b 45 f8 mov -0x8(%rbp),%eax 48: 3b 45 ec cmp -0x14(%rbp),%eax 4b: 7c d2 jl 1f <main+0x1f> 4d: 8b 45 fc mov -0x4(%rbp),%eax 50: 89 c6 mov %eax,%esi 52: bf 00 00 00 00 mov $0x0,%edi 57: b8 00 00 00 00 mov $0x0,%eax 5c: e8 00 00 00 00 callq 61 <main+0x61> 61: b8 00 00 00 00 mov $0x0,%eax 66: c9 leaveq 67: c3 retq
Y86-64彙編:安全
.file "sum.c" .section .rodata .LC0: .string "Total: %d\n" .text .globl main .type main, @function main: .LFB2: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $32, %rsp irmovq %edi, -20(%rbp) irmovq %rsi, -32(%rbp) irmovlq $0, -4(%rbp) irmovlq $0, -8(%rbp) jmp .L2 .L3: movl -8(%rbp), %eax cltq leaq 0(,%rax,8), %rdx movq -32(%rbp), %rax addq %rdx, %rax movq (%rax), %rax movq %rax, %rdi call atoi addl %eax, -4(%rbp) addl $1, -8(%rbp) .L2: movlq -8(%rbp), %eax cmpl -20(%rbp), %eax jl .L3 movl -4(%rbp), %eax movl %eax, %esi movl $.LC0, %edi movl $0, %eax call printf movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE2: .size main, .-main .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609" .section .note.GNU-stack,"",@progbits
基於socket 使用教材的csapp.h csapp.c,實現daytime(13)服務器(端口咱們使用13+後三位學號)和客戶端
服務器響應消息格式是
「
客戶端IP:XXXX
服務器實現者學號:XXXXXXXX
當前時間: XX:XX:XX
」
上方提交代碼服務器
提交一個客戶端至少查詢三次時間的截圖測試截圖網絡
提交至少兩個客戶端查詢時間的截圖測試截圖多線程
基於socket,用多進程和多線程分別實現daytime服務器併發功能。併發
詳情查看個人博客:
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
進程的定義:
狹義定義:進程就是程序的執行過程。
進程是一個具備必定獨立功能的程序關於某個數據集合的一次運行活動。它是操做系統動態執行的基本單元,在傳統的操做系統中,進程既是基本的分配單元,也是基本的執行單元。
主要特徵:
動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的。
併發性:任何進程均可以同其餘進程一塊兒併發執行
獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位;
異步性:因爲進程間的相互制約,使進程具備執行的間斷性,即進程按各自獨立的、不可預知的速度向前推動
結構特徵:進程由程序、數據和進程控制塊三部分組成。
多個不一樣的進程能夠包含相同的程序:一個程序在不一樣的數據集裏就構成不一樣的進程,能獲得不一樣的結果;可是執行過程當中,程序不能發生改變。
調度算法
FIFO(First Input First Output 先進先出法)、
RR(時間片輪轉算法)、
(HPF)最高優先級算法。
定義:
線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程。
兩個基本類型:
用戶級線程:管理過程所有由用戶程序完成,操做系統內核心只對進程進行管理。
系統級線程(核心級線程):由操做系統內核進行管理。操做系統內核給應用程序提供相應的系統調用和應用程序接口API,以使用戶程序能夠建立、執行、撤消線程。
線程與進程的區別:
1)地址空間和其它資源(如打開文件):進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。
2)通訊:進程間通訊IPC,線程間能夠直接讀寫進程數據段(如全局變量)來進行通訊——須要進程同步和互斥手段的輔助,以保證數據的一致性。
3)調度和切換:線程上下文切換比進程上下文切換要快得多。
4)在多線程OS中,進程不是一個可執行的實體。
經過I/O多路複用技術,系統內核緩衝I/O數據,當某個I/O準備好後,系統通知應用程序該I/O可讀或可寫,這樣應用程序能夠立刻完成相應的I/O操做,而不須要等待系統完成相應I/O操做,從而應用程序沒必要因等待I/O操做而阻塞。
與多進程和多線程技術相比,I/O多路複用技術的最大優點是系統開銷小,系統沒必要建立進程/線程,也沒必要維護這些進程/線程,從而大大減少了系統的開銷。
I/O複用典型的應用:
(1)當客戶處理多個描述字時(通常是交互式輸入和網絡套接口),必須使用I/O複用。
(2)當一個客戶同時處理多個套接口時,而這種狀況是可能的,但不多出現。
(3)若是一個TCP服務器既要處理監聽套接口,又要處理已鏈接套接口,通常也要用到I/O複用。
(4)若是一個服務器即要處理TCP,又要處理UDP,通常要使用I/O複用。
(5)若是一個服務器要處理多個服務或多個協議,通常要使用I/O複用。
在用戶空間中實現線程
線程在操做系統內核中實現
混合模式
初始化:
在Linux下, 線程的互斥量數據類型是pthread_mutex_t. 在使用前, 要對它進行初始化:
對於靜態分配的互斥量, 能夠把它設置爲PTHREAD_MUTEX_INITIALIZER, 或者調用pthread_mutex_init。
對於動態分配的互斥量, 在申請內存(malloc)以後, 經過pthread_mutex_init進行初始化, 而且在釋放內存(free)前須要調用pthread_mutex_destroy。
返回值:成功則返回0, 出錯則返回錯誤編號。
說明:若是使用默認的屬性初始化互斥量, 只需把attr設爲NULL。
死鎖:
死鎖主要發生在有多個依賴鎖存在時,會在一個線程試圖以與另外一個線程相反順序鎖住互斥量時發生。如何避免死鎖是使用互斥量應該格外注意的東西。
整體來說, 有幾個基本原則:
對共享資源操做前必定要得到鎖。
完成操做之後必定要釋放鎖。
儘可能短期地佔用鎖。
若是有多鎖,如得到順序是ABC連環扣,釋放順序也應該是ABC。
線程錯誤返回時應該釋放它所得到的鎖。
在編譯中要加 -lpthread參數。
PID有什麼做用或意義
PID就是各進程的身份標識,程序一運行系統就會自動分配給進程一個獨一無二的PID。進程停止後PID被系統回收,可能會被繼續分配給新運行的程序。
PID一列表明瞭各進程的進程ID,也就是說,PID就是各進程的身份標識。
只要運行一程序,系統會自動分配一個標識。
是暫時惟一:進程停止後,這個號碼就會被回收,並可能被分配給另外一個新進程。
只要沒有成功運行其餘程序,這個pid會繼續分配給當前要運行的程序。
若是成功運行一個程序,而後再運行別的程序時,系統會自動分配另外一個pid。
這是一個查看父子進程PID的代碼
#include <stdio.h> main() { int pid; pid = getpid(); printf("my pid is %d\n", pid); pid = getppid(); printf("my parent’s pid is %d\n", pid); sleep(40); }
運行結果:
父進程和子進程的PID有什麼聯繫
父進程和子進程的關係是子進程是父進程的一個副本,建立子進程後,子進程會有本身的空間,而後把父進程的數據拷貝到子進程的空間裏。
運行時,誰先運行是不肯定的,由系統決定。
若連續建立進程,PID是連續的。
- [20155214](http://www.cnblogs.com/besti155214/p/7782336.html) - 結對照片 - 結對學習內容 - 多進程與多線程的daytime服務器實現。 - 第四章家庭做業。
一、使用多進程和多線程可大大提升代碼的運行效率。
二、線程能夠在操做系統和用戶空間中混合調用。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第三週 | 114/114 | 3/3 | 20/20 | |
第四周 | 136/250 | 2/5 | 18/38 | |
第五週 | 87/337 | 2/7 | 22/60 | |
第六週 | 271/608 | 2/9 | 30/90 | |
第七週 | 185/716 | 2/11 | 30/90 | |
第八週 | 531/1247 | 3/14 | 30/90 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:25小時
實際學習時間:20小時
改進狀況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)