进程内存分布
内存分布
以32位系统为例,共有4G的寻址能力,进程在内存中的分布如下图所示。Linux默认将高地址的1G空间分配给内核,称为内核空间,剩下的3G空间分配给进程使用,称为用户空间。
操作系统内核区
用户不可见
用户栈
栈指针,向下扩展
动态堆
向上扩展
全局区(静态区)
.data初始化 .bss未初始化
文字常量区(只读数据)
常量字符串
程序代码区
栈指针,向下扩展
栈区
由编译器自动分配释放,速度较快
用来存储函数调用时的临时信息的结构,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。这些局部变量等空间都会被释放
程序运行过程中函数调用时参数的传递也在栈上进行,如递归调用栈
当栈过多的时候,就是导致栈溢出(比如大量的递归调用或者大量的内存分配)
栈是向低地址扩展的数据结构,是一块连续的内存的区域,空间有限
堆区
由程序员分配 (new,malloc) 释放 (delete,free) ,并指明大小,速度较慢
若程序员不释放,导致内存泄漏,new 完没有 delete
不过在整个程序结束时由操作系统回收,但是这样无疑增加 ...
碎玉零珠————计算机网络
OSI 七层模型
理论上的网络通信模型
应用层:最靠近用户的层,负责处理特定的应用程序细节。这一层提供了网络服务与用户应用软件之间的接口。例如,Web 浏览器、FTP 客户端和服务器、电子邮件客户端等。
表示层:确保从一个系统发送的信息可以被另一个系统的应用层读取。它负责数据的转换、压缩和加密。例如,确保数据从一种编码格式转换为另一种,如 ASCII 到 EBCDIC。
会话层:管理用户的会话,控制网络上两节点间的对话和数据交换的管理。它负责建立、维护和终止会话。例如,建立一个会话令牌,以便在网络上的两个节点之间传递。
传输层:提供端到端的通信服务,保证数据的完整性和正确顺序。这一层包括 TCP 和 UDP 等。
网络层:负责在多个网络之间进行数据传输,确保数据能够在复杂的网络结构中找到从源到目的地的最佳路径。这层使用的是 IP(Internet Protocol)协议。
数据链路层:在物理连接中提供可靠的传输,负责建立和维护两个相邻节点间的链路。包括帧同步、MAC(媒体访问控制)。
物理层:负责在物理媒介上实现原始的数据传输,比如电缆、光纤和无线信号传输。涉及的内容包括电压、接口、针 ...
局域网中的主机之间通信
局域网中的主机之间通信
局域网中的主机间通信分为 2 种:
两台主机处于同一网段
两台主机之间处于不同网段
局域网中处于同一网段中的主机通信
假如:主机 A 要和主机 B 通信,主机 A 知道主机 B 的 IP 地址。知道 IP 地址是通信的前提。首先,要通进行通信,IP 地址和 MAC 地址是必不可少的,IP 地址已经知道了,那么主机 A 必须要知道主机 B 的 MAC 地址,先在 ARP 表中查看有无该 IP 地址,如果有,就找出对应的硬件 MAC 地址,如果没有,主机 A 广播发送 ARP 请求来获取目的 MAC 地址,说 who is 192.168.1.102 ?
当 IP 地址是 192.168.1.102 的主机 B 收到后,会回复主机 A ,说 “我是 192.168.1.102 ,我的 MAC 地址是:xx-xx-xx-xx-xx-xx”(ARP应答)。这样一来,主机 A 就知道主机 B 的 MAC 地址了,当然,由于主机 A 在广播发送的 ARP 报文时,主机 A 的 MAC 地址被作为源 MAC 地址而封装在 MAC 帧中,所以主机 B 收到广播报文后 ...
进程、线程、协程之间的区别
简述进程、线程、协程的概念进程
保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,不同进程间可以进行进程间通信,上级挂靠单位是操作系统。一个应用程序相当于一个进程,操作系统会以进程为单位,分配系统资源(CPU 时间片、内存等资源),进程是资源分配的最小单位。
线程
线程从属于进程,也被称为轻量级进程,是程序的实际执行者。线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条- 线程并行执行不同的任务。一个线程只有一个进程。
每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
协程
协程是伴随着主线程一起运行的一段程序。
协程与协程之间是并行执行,与主线程也是并行执行,同一时间只能执行一个协程提起协程,自然是要想到线程,因为协程的定义就是 ...
进程调度算法
进程的调度方式
通常有以下两种进程调度方式:
非剥夺(非抢占)调度方式:当一个进程正在处理机上执行时,即使有某个更为重要或者紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,直到该进程完成或发生某种事件而进入阻塞态时,才把处理机分配给更为重要或紧迫(优先级更高)的进程。其优点是实现简单,系统开销小,适用于大多数批处理系统,但它不能用于分时系统和大多数实时系统。
剥夺(抢占)调度方式:当一个进程正在处理机上执行时,若有某个更为重要或紧迫的进程(优先级更高)的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给这个更重要的进程。这种方式对提高系统吞吐率和响应效率都有明显的好处。但抢占也要遵循一定原则。
调度的基本准则
主要有以下几种:
CPU利用率:CPU是计算机系统中最重要和最昂贵的资源之一,所以应该尽可能使得CPU保持忙的状态,资源利用率尽可能高。
系统吞吐量:单位时间内CPU完成的作业数量。长作业需要消耗较长的处理机时间,会降低系统的吞吐量。对于短作业,他们所需消耗的处理机时间较短,因此能提高系统吞吐量。调度算法和方式不同,也会对系统的吞吐量产生较大影响。
周转时 ...
TCP 长连接和短连接
TCP 长连接和短连接什么是长连接和短连接
长连接(long connnection),指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。
短连接(short connnection),是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时才去建立一个连接,数据发送完成后则断开此连接,即每次连接只完成一项业务的发送。
TCP 长短连接的优势TCP 短连接
模拟一下TCP短连接的情况:client 向 server 发起连接请求,server 接到请求,然后双方建立连接。client 向 server 发送消息,server 回应 client ,然后一次读写就完成了,这时候双方任何一个都可以发起 close 操作,不过一般都是 client 先发起 close 操作。
从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作。
短连接优点:管理起来方便,存在的连接都是有效的连接,不需要额外的控制手段。
TCP 长连接
模拟一下TCP长连接的情况,client 向 server 发起连接,serve ...
三次握手,四次挥手
三次握手
第一次握手:SYN(最开始都是 CLOSE,之后服务器进入 LISTEN)
发起连接:客户端发送一个 TCP 报文段到服务器。这个报文段的头部中,SYN 位被设置为 1,表明这是一个连接请求。同时,客户端会随机选择一个序列号(Sequence Number),假设为 x,发送给服务器。
目的:客户端通知服务器它希望建立连接,并告知服务器自己的初始序列号。
状态:客户端进入 SYN_SENT 状态。
第二次握手:SYN + ACK
确认并应答:服务器收到客户端的连接请求后,如果同意建立连接,它会发送一个应答 TCP 报文段给客户端。在这个报文段中,SYN 位和 ACK 位都被设置为 1。服务器也会选择自己的一个随机序列号,假设为 y,并将客户端的序列号加 1(即 x+1)作为确认号(Acknowledgment Number),发送给客户端。
目的:服务器告诉客户端,它的连接请求被接受了,并通知客户端自己的初始序列号。
状态:服务器进入 SYN_RCVD 状态。
第三次握手:ACK
最终确认:客户端收到服务器的应答后,还需要向服务器发送一个确认。这个 TCP 报文段的 ...











