这几天天天看八股,总是输入也不行呀,还得是输出一下记记笔记在脑子里过一遍才记得住,也会有一些自己的理解。
进程是运行着的程序,我们写完一个代码,完了以cpp格式保存,这个玩意儿叫程序。在执行这个程序的时候,这个程序会被翻译成一串计算机看得懂的二进制文件,《我记得》本科在学计算机组成原理的时候看到过汇编程序,那个是相对java、C++这些更接近计算机的语言了,汇编会被接着翻译成二进制代码,放在CPU里面执行,这个时候程序跑起来了,这个就叫进程。
比如下面这段代码就叫做程序,运行的时候计算机会把他翻译成汇编语言而后翻译成二进制可执行文件。
#include <stdio.h>
int sum(int x,int y)
{
int t=x+y;
return t;
}
int main()
{
sum(1, 2);
return 0;
}
这就是一段代码。
用gcc -S 该段代码的文件名
gcc -S 该段代码文件名后会生成后缀.s的文件
内容如下所示:
.file "test.c"
.text
.globl sum
.type sum, @function
sum:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -20(%rbp)
movl %esi, -24(%rbp)
movl -20(%rbp), %edx
movl -24(%rbp), %eax
addl %edx, %eax
movl %eax, -4(%rbp)
movl -4(%rbp), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size sum, .-sum
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $2, %esi
movl $1, %edi
call sum
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section .note.GNU-stack,"",@progbits
我不太看得懂,大概猜一下,当然这个对于本文来说不重要。
线程是什么?
进程是资源分配的基本单位,线程是调度的基本单位,线程是进程中的实际运作单位。
为什么要用线程?
说到这个不得不从进程通信开始说起,进程之间可以通过
对于一个任务,假如每一个子任务都要给一个进程来完成,。
每次开启一个进程都需要创建一个PCB,结束时要回收PCB,如果被阻塞,进行进程切换:保存上下文->读取上下文这也是比较大的开销。
那么有一些事情如果能够有更小的单位去执行就好了,此时我正住在出租屋里,我觉得这就是一个很好的例子,出租屋就是一个进程,里面有厨房有卫生间有房间,睡觉的人可以先吃饭,上个卫生间,然后再睡觉,这样多好。
假如卫生间是一个进程,厨房是一个进程,就好比在卫生间的人要进厨房,还得和厨房进行通信,然后才能进去。
通过这个例子,我们能够体会到,线程很大的一个优势就是共享资源,减少很多不必要的进程通信和进程开销。
再次体会这句话:进程是资源分配的基本单位,线程是调度的基本单位。