操作系统(0)

进程和线程


进程在操作系统边界比较明显,进程和进程之间相对比较独立

进程里有很多线程,线程是进程里面的一部分。

我们一个操作系统同时有几十几百个在运行,每个进程可能有少到几个多到几十个上百个线程在运行

内存,是在进程里面的,真正的电脑是4G到8G这样一个内存,我们内存为什么限定在进程里面?

是不是我把4G内存切一部分分给进程?并不是这样,这里的内存是逻辑内存

我们都知道操作系统有32位操作系统和64位操作系统。这32位和64位到底是什么意思呢,就是在内存上面 

是指内存的寻址空间,32位就是2的32次方就是4G,32位的操作系统每个进程都会有4G的内存空间,当然这只是说你有一个4G的内存空间,你可以用但是我并不是把4G分给你的,我们上百个进程没人分4G是不可能的,不管你机器上到底物理内存是多大,我们操作系统是在我们程序和我们硬件之间的中间的层次,我们在程序看到的是各自的寻址空间,每个进程的内存都是互相独立的。不然的话我举个例子。我的指针的值改一改我就知道别人的进程和内存的值了。那我通过这样就可以比如说我看到你的微信或者网上银行的内存,这是一件非常可怕的事情,你里面所有的隐私的 信息都能读出来,这是不可能的。

这个句柄在英文里叫做Handdle,文件和网络资源这些和内存不一样,他是所有的进程所共有的 ,我这个进程和别人的进程都可以打开同一个文件。或者都可以去抢同一个网络的端口这些都是可以的



对于线程我们注意到线程是进程里面的一块,这个线程这根线里面到底有啥?首先是一个栈,这个栈通俗来讲我们叫做堆栈。数据结构里面堆和栈是两个不一样的数据结构,但是我们通常习惯说我们调用堆栈。其实这个堆在这里面没有含义的,调用堆栈就是调用栈的意思。在这个栈里有什么,我们从主线程的入口Main函数,他会不断地进行函数调用,每次调用会把所有参数和返回地址压到栈里面,然后一层层在栈里面放进去,包括我们每个函数的一些局部变量,就是放在栈里面。

线程还有一个非常重要的东西叫做PC

PC是program counter,它里面放了当前或者是下一条指令的地址,就是说我们真正操作系统在运行的是一个一个线程,进程是一个容器,我们线程才是他正在运行的,他的PC就指向当前指令。

这个指令本身放在内存里。每个线程都有自己的一个PC的指针,会指向自己这串代码指向的内存,那么我们计算机绝大部分都是存储程序性的。就是说我们数据和我们的程序都是同时存储在我们同一片内存里的,这内存既有我们所有的变量,又有我们的程序。因此我们的PC指针就是指向内存的。所以我们经常听到漏洞就是缓冲区溢出,这个就是比如有一个地方给你输入用户名,我本来是用来给你存数据的地方,然后这个人把用户名输入的特别长,这个长度超出了我给用户名分配的缓冲区,一直往后写,写到存储程序的那部分内存去。黑客就可以通过这种方法,把他所要想要运行的代码,通过这个用户名的框植入进来,当然我们防止的方法就是来检测我们用户名的长度不要超过缓冲区大小,这个就是我们PC指针

还有一块叫做TLS, thread local storage。我们之前看到每个进程有自己的独立的一块内存,这个很好,我们现场能不能有自己的独立的内存呢?有的,系统提供了一个叫做TLS的东西我们可以在这里分配内存,去存放我们的变量这些数据就是我们线程所独有的一些数据。

我们可以看到线程是操作系统真正运行的,进程只是一个容器。

他把一部分相关的东西放在了一起,旁边放了一个很强的隔离,把不同的程序隔离开来  


进程间没办法共享内存,所以我们有一些进程间交互的方案,比较常用的就是通过TCP/IP的端口实现,当然他还有许多其他的操作系统提供的方案,但那些方案可能跟操作系统的相关性更加大一些 

线程间的通信就非常简单了我们有共享的一大块内存,只要大家指针是同一个就可以看到各自的内存

然后还有开销,进程的开销很大,我们要给他分配这么多的内存,而线程我们只是给他分配一个栈,一个program count等等不同


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值