系统调用

Linux socket.error: [Errno 99] Cannot assign requested

纵然是瞬间 提交于 2020-01-08 12:24:21
Python 使用 from pymongo import MongoClient 连接mongodb,由于没有关闭连接,导致 netstat -alnt|wc -l 达到几万个 socket.error: [Errno 99] Cannot assign requested address 网上你去搜,基本都是说bind的时候,地址已经被用了,都是胡扯。地址被用报的错误应该是: Address already in use才对 然后我看得都是英文的,说明外国人也不是想象中的那么一丝不苟, 言归正传。socket发起connect请求的时候会随机分配一个端口给你。这个分配的端口是有范围的,记录在: /proc/sys/net/ipv4/ip_local_port_range 这个文件里面(fedora 17).当你用多个进程发起过多的请求的时候,端口用完了就会报这个错误。比如我就开了4个进程,一下发起了40000个请求。 你可以做个实验试试,切换到root用户,敲一下这条命令: echo 32768 32769 > /proc/sys/net/ipv4/ip_local_port_range 这下你打开人人,微博就会发现很多图片加载不出来了。因为图片加载在浏览器里面就是并行加载的,由于你没有足够的端口数,所以图片加载都失败了。别当心,这个修改是临时的(是不是临时的我也不知道

UNIX基础知识

ⅰ亾dé卋堺 提交于 2020-01-08 00:37:10
1 UNIX基础知识 1.1 UNIX体系结构 操作系统可定义为一种软件,它控制计算机硬件资源,提供程序运行环境,通常将这种软件称为内核(kernel)。UNIX操作系统的体系结构如下图所示,其中内核的接口被称为系统调用(system call图中阴影部分),公共函数库构建在系统调用接口之上,应用程序可调用公共函数库,也可以直接使用系统调用。shell是一种特殊的应用程序,为运行其他应用程序提供一个接口。 1.2 登录 (1) 登录名 用户在登录UNIX时,先键入登录名,然后键入口令。系统在其口令接口(Redhat 2.6.32-431.el6.x86_64在/etc/passwd下)中查看登录名。如下: 口令文件中的登录项是由7个以冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID、数字组ID、字段注释、起始目录以及shell程序。 (2)shell 用户登录后,系统通常先显示一些系统信息,然后用户可通过shell程序键入命令。shell是一个命令行解释器,可读取用户输入,然后执行命令。shell的用户输入通常来自于终端(交互式shell),有时则来自于文件(称为shell脚本)。UNIX系统中shell有多种,用得比较多的是Bash shell。 1.3 文件和目录 (1)文件系统 UNIX文件系统是目录和文件的一种层次结构,所有东西的起点是称为根(root)目录

敏捷方法适合什么样的团队?

孤街浪徒 提交于 2020-01-07 22:18:34
  敏捷开发适用于研发团队吗?      距敏捷开发宣言的发布已经过去了将近二十年,现在很多团队都在思考“敏捷”的工作方式。营销团队想要尝试Sprint的方式来加速盈利,运营团队正在采用Scrum敏捷项目管理,而人力资源团队则正在寻求如何为公司战略注入更多的灵活可变性。      那么对于研发团队而言,敏捷实际上只是一套帮助解决大型且复杂项目的方法论。在工作中,如何正确的运用敏捷方法哪种方式,一直存在很多争论。      是否采用敏捷开发?      通常而言,复杂、大型的研发项目需要跨部门的协调,项目经理总是希望可以快速实施并交付产品。但是当你想要调动全部资源去推动此项目时,这又将对其他部门的业务和工作产生影响,这是不现实的。因此在项目研发过程中,团队需要采用敏捷开发方法,并以不断迭代的方式来应对快速变化的需求。      敏捷并非意味着在项目开始之前就定义最终需求并安排好全部工作内容。但对于跨公司的庞大项目而言,需要了解产品需求和路线,否则每个人工作都有可能出现差错。那么是否有可能将敏捷开发应用于类似上述的庞大项目呢?      我认为是可行的,但需要实行真正意义上的的敏捷开发。      请记住,敏捷并不是每个人都必须遵循的一套固定规则。它是一种方法论,是帮助团队应对快速变化的需求、提高工作效率的一种理念和价值观。在产品研发过程中

[转] Linux系统之进程状态

放肆的年华 提交于 2020-01-07 21:07:10
转自: https://www.cnblogs.com/littlecharacter/p/12154588.html 一、进程状态 D:uninterruptible sleep (usually IO) R:running or runnable (on run queue) S:interruptible sleep (waiting for an event to complete) T:stopped by job control signal t:stopped by debugger during the tracing W:paging (not valid since the 2.6.xx kernel) X:dead (should never be seen) Z:defunct ("zombie") process, terminated but not - reaped by its parent 1、R (TASK_RUNNING),可执行状态 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进而,进程调度器就从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

strace

一笑奈何 提交于 2020-01-07 19:31:08
strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 来源: https://www.cnblogs.com/igoodful/p/12152495.html

Linux系统之进程状态

最后都变了- 提交于 2020-01-07 15:52:11
一、进程状态 D:uninterruptible sleep (usually IO) R:running or runnable (on run queue) S:interruptible sleep (waiting for an event to complete) T:stopped by job control signal t:stopped by debugger during the tracing W:paging (not valid since the 2.6.xx kernel) X:dead (should never be seen) Z:defunct ("zombie") process, terminated but not - reaped by its parent 1、R (TASK_RUNNING),可执行状态 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进而,进程调度器就从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。 很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态

linux设备驱动第二篇:一个简单hello world驱动如何实现

余生长醉 提交于 2020-01-07 14:59:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 上一篇介绍了linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序。而这个驱动的唯一功能就是输出hello world。 在编写具体的实例之前,我们先来了解下linux内核下调试程序的一个重要函数printk以及几个重要概念。 printk类似c语言的printf,是内核中输出打印信息的函数。以后驱动调试中的重要性不言而喻,下面先做一个简单介绍。 printk的级别 日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):   #define KERN_EMERG 0/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/   #define KERN_ALERT 1/*报告消息,表示必须立即采取措施*/   #define KERN_CRIT 2/*临界条件,通常涉及严重的硬件或软件操作失败*/   #define KERN_ERR 3/*错误条件,驱动程序常用KERN_ERR来报告硬件的错误*/   #define KERN_WARNING 4/*警告条件,对可能出现问题的情况进行警告*/   #define KERN_NOTICE 5/*正常但又重要的条件

第五周 内核编译与系统调用

夙愿已清 提交于 2020-01-07 09:34:20
内核编译与系统调用 任务详情 参考“实践2.2编译内核及系统调用”完成相实践 出问题参考“编译内核之扩大硬盘空间.docx” 附件提交新加系统调用测试结果截图 实验截图 感受 此次试验老是出问题,下载好了内核之后,解压一直出现 “no space left on device”。 来源: https://www.cnblogs.com/20199304lbs/p/12151770.html

Python语法速查: 10. 异常

…衆ロ難τιáo~ 提交于 2020-01-07 08:08:20
/*--> */ /*--> */ 返回目录 本篇索引 (1) 内置异常 (2) 自定义异常 (3) 主动引发异常 (4) 捕捉异常 (5) error模块 (6) with语句 (1)内置异常 ● 异常的基类: 以下这些异常作为具体异常的基类,都不会被显式引发,但是可以使用它们捕捉某种错误。 基类名称 说明 BaseException 所有内置异常的基类,其他所有内置异常都派生自该类。 Exception 所有内置的非系统退出异常都派生自此类(即除了:SystemExit, GeneratorExit, KeyboardInterrupt之外的所有内置异常)。所有用户自定义异常也应当派生自此类。 ArithmeticError 算术运算异常的基类,包括溢出、除零等等。 LookupError 索引和键错误的基类。 BufferError 当与缓冲区相关的操作无法执行时引发,一般由用户自行继承使用。 ● 具体异常 以下异常属于经常被引发的异常。 具体异常名称 说明 以下异常直接继承自: BaseException GeneratorExit 由生成器的.close()方法引发。 KeyboardInterrupt 由键盘中断(通常为 Ctrl-C)生成。 SystemExit 程序退出,一般系统函数sys.exit()引发。 以下异常继承自: BaseException ->

Unix IO模型

怎甘沉沦 提交于 2020-01-07 00:45:38
Unix下可用的IO模型有五种 [1] : 阻塞式IO 非阻塞式IO IO复用(select和poll) 信号驱动IO(SIGIO) 异步IO(POSIX的aio_系列函数) 下面介绍自己对前三种IO模型的理解,后面两种模型如果之后有机会接触到,再回来补充! 阻塞式IO 程序执行一个系统调用时,会进行休眠等待返回结果,不在执行之后的代码 比如服务器端以阻塞IO方式调用read()读取客户端发来的数据时,代码和流程如下所示: while(connSocket.read(buf, BUFFER_SZ) > 0){ // 1 // 处理接收到的数据 // 2 } 调用read()函数,由用户态切换到内核态,查看接收缓存区是否有数据,如果有数据,则将数据从内核拷贝到用户空间,否则等待对端发送数据,此时应用进程阻塞在1处,无法继续执行,直到read()返回 可见阻塞IO效率低,因为阻塞等待是在浪费进程所获得的执行机会,所以一般采用非阻塞方式编写服务器程序 注意:read()并不一定是阻塞的,取决于套接字是否是阻塞的 非阻塞式IO 非阻塞IO是系统调用时不会等待数据准备好才返回,而是立即返回,此时可以执行之后的程序,所以程序运行过程中没有进入休眠状态 比如以非阻塞方式调用read()读取对端发来数据的过程: for(;;){ len = connSocket.read(buf, BUFFER