进程、线程、socket套接字-资源大小 & 切换代价
另,进程 & 线程的很多知识可以看这里:http://www.cnblogs.com/charlesblc/p/6135666.html
今天查了一下进程和线程的资源占用。
比如问:栈和堆的大小?
答:栈是线程的概念,堆是进程的概念。
线程栈的大小,通过 ulimit -s 来设定。Linux默认是10240,也就是10M,Windows默认是1M.
堆的大小,一般最大是 虚拟空间大小 - 1G内核空间大小 - 全局空间等部分,还跟寻址有关。
进程的大小,比线程,还多出了一个PCB(描述进程基本情况和运行状态),另外程序段,也是放在进程里的,线程保存的程序计数器、一组寄存器,和栈。
socket套接字其实都是打开的文件句柄,只要文件句柄够用,socket套接字就够用。
虽然端口port只有65535,并且1024以下的还被保留了;但是socket是四元组,本地同一个端口可以对应远端多个IP和多个端口。
所以理论上这个四元组可以很多很多,网上有人说是 2的48次方。
更多的可以看《程序员的自我修养》。虽然我也不知道相关内容有没有。
切换代价
进程和线程的切换代价,一直是对比的重点。下面罗列一下:
进程间切换的步骤:
1,保存程序计数其以及其他寄存器。
2, 更新当前处于“运行态”的进程的进程控制块,把进程状态改为相应状态,更新其他相关域
3, 把被切换进程的进程控制块移到相关状态的队列
4, 选择另外一个进程开始执行,把该进程进程控制块的状态改为“运行态”
5, 恢复被选择进程的处理器在最近一次被切换出运行态时的上下文,比如载入程序计数器以及其他处理器的值。
进程间切换伴随着两次模式切换(用户--内核,内核--用户)。
(同一进程内)线程间切换的步骤:
线程分两种,用户级线程和内核级线程
在用户级线程中,
有关线程管理的所有工作都由应用程序完成,内核没有意识到线程的存在。
用户级线程间切换时,只需要保存用户寄存器的内容,程序计数器,栈指针,不需要模式切换。
缺点:
1, 在进程的某个线程执行系统调用时,不仅该线程被阻塞,该线程所在进程的所有线程都被阻塞
2, 无法利用多处理器
在内核级线程中,
有关线程的管理工作都是由内核完成的,应用程序部分没有线程管理的权限,只有一个接口(API)
内核级线程间切换时,除了保存上下文,还要进行模式切换。(看起来跟进程切换差不多,但不需要切换内存,缓存等,下面有详细描述)
优点:
1, 可以利用多处理器
2, 线程阻塞不会导致进程阻塞
这一篇,讲的更具体一些:http://blog.csdn.net/mba16c35/article/details/43382737
进程切换分两步
1.切换页目录以使用新的地址空间
2.切换内核栈和硬件上下文。
对于linux来说,线程和进程的最大区别就在于地址空间。
对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的(但是仍然有不同,见下)。所以明显是进程切换代价大。
线程上下文切换和进程上下文切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理器的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。
进程、线程、socket套接字-资源大小 & 切换代价的更多相关文章
- socket套接字补充、操作系统发展史、进程
目录 socket套接字之UDP协议 操作系统的发展史 手工操作 批处理系统 联机批处理系统 脱机批处理系统 多道技术 进程理论 并发与并行 同步与异步 阻塞与非阻塞 同步异步与阻塞非阻塞总结 soc ...
- 网络编程初识和socket套接字
网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...
- Python之异常处理和socket套接字连接7
一.异常处理 1)异常处理的使用意义 什么是异常处理 异常是程序发生错误的信号,即程序一旦出错就会立刻产生一个异常,如果该异常没有被处理 那么异常就抛出来,程序的运行也随之终止 异常分为三部分: 异常 ...
- 19 网络编程--Socket 套接字方法
1.Socket(也称套接字)介绍 socket这个东东干的事情,就是帮你把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装好了 ,你只需要调用几行代码,就可以给别的机器发消息 ...
- 19、网络编程 (Socket套接字编程)
网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些 ...
- 网络编程--Socket(套接字)
网络编程 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中 有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后 如何可靠高效的进行数据传输.在 ...
- 31_网络编程(Socket套接字编程)_讲义
今日内容介绍 1.网络三要素及传输协议 2.实现UDP协议的发送端和接收端 3.实现TCP协议的客户端和服务器 4.TCP上传文件案例 01网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用 ...
- 网络编程之socket套接字
目录 socket套接字简介 socket模块 通信循环 代码优化 连接循环 半连接池 黏包问题 解决黏包问题 黏包问题特殊情况(文件过大) socket套接字简介 由于操作OSI七层是所有C/S架构 ...
- 网络编程与socket套接字
网络编程与socket套接字 传输层 PORT协议 port是一种接口,数据通过它在计算机和其他设备(比如打印机,鼠标,键盘或监视器)之间,网络之间和其他直接连接的计算机之间传递 TCP协议 传输 ...
随机推荐
- ECSHOP 用户中心 我的订单前台显视订单每张商品图片及收货人
先在网站根目录打开文件 includes/lib_transaction.php 查找代码 $sql = "SELECT order_id, order_sn, order_status, ...
- ios之json,xml解析
JSON解析步骤: 1.获取json文件路径 NSString*path = [[NSBundle mainBundle] pathForResource:@"Teacher"of ...
- 原生js下拉菜单
var oDiv = document.getElementById("sunav"); var oLi = oDiv.getElementsByClassName("s ...
- Elasticsearch + logstash中文指南
http://kibana.logstash.es/content/logstash/examples/nginx-access.html http://es.xiaoleilu.com/030_Da ...
- Lua JSONRPC学习笔记
JSON RPC JSON RPC 为利用json数据格式来执行远程调用方式, 作用同xmlrpc,不过与xmlrpc相比, jsonrpc更加轻量,json更加节省数据量,更加可读性高. 官网网站: ...
- Java基础必备 -- 堆栈、引用传值、垃圾回收等
在Java中,对象作为函数参数的传递方式是值传递还是引用传递?String str = "abc" 与 String str = new String("abc&quo ...
- sql 里 text类型的操作(转载)
SQL Server中TEXT类型字段值在数据库中追加字符串方法 对text类型字段值进行追加更新的操作,一开始用了简单的update语句试了试,有错误,原来text.ntext类型的字段不能和 va ...
- 跨域解决方案一:使用CORS实现跨域
跨站HTTP请求(Cross-site HTTP request)是指发起请求的资源所在域不同于请求指向的资源所在域的HTTP请求. 比如说,我在Web网站A(www.a.com)中通过<img ...
- JAVA的网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- Java接口回调
public class A { private D d; private C c; public A (C c) { this.c = c; } public void setD (D d) { t ...