GVKun编程网logo

Linux C 线程池实现(linux线程池实现原理)

3

对于想了解LinuxC线程池实现的读者,本文将是一篇不可错过的文章,我们将详细介绍linux线程池实现原理,并且为您提供关于arch-linux–ArchLinux64bitAndroidADB?、a

对于想了解Linux C 线程池实现的读者,本文将是一篇不可错过的文章,我们将详细介绍linux线程池实现原理,并且为您提供关于arch-linux – Arch Linux 64bit Android ADB?、arch-linux – 在Android设备上启动原生Arch Linux、Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报、c# 线程池实现 只是一个原理性的实现细节内容忽略的有价值信息。

本文目录一览:

Linux C 线程池实现(linux线程池实现原理)

Linux C 线程池实现(linux线程池实现原理)

Linux C 线程池实现

学习网络编程时,自己动手实现一个Web Server是一个很有意思的经历。大多数Web Server都有一个特点:在单位时间内需要处理大量的请求,并且处理这些请求的时间往往还很短。《深入理解计算机系统》 (CSAPP) 在讲解网络编程时实现了一个经典的Web Server,这个Web Server不仅满足了静态请求,同时还满足了动态请求 (CGI)。虽然这个Web Server能够正常使用,但是仍存在一个明显的缺陷:它是一个迭代式的Web Server,这意味着在一个请求处理完毕前,不能同时处理另一个请求,而我们之前提到Web Server的一个重要特点就是在单位时间内可能会有大量的请求,所以如果投入工业界,这种情况自然是无法容忍的。

多进程 Web Server 模型

解决上面提到的Web Server只能一个接着一个处理请求的第一个方案是:当accept到一个请求时,fork一个子进程去处理这个请求,而主进程仍然在监听是否有新的连接请求。多进程模型在表面上看似乎解决了问题,但是我们都知道fork一个进程的开销是非常大的,基于以下几个事实。

  • 从概念上说,可以将fork认作对父进程程序段、数据段、堆段以及栈段创建拷贝。但是如果真的只是简单的将父进程虚拟内存页拷贝到子进程,那就太浪费了。现代UNIX(Linux) 在实现fork时往往会采用两种技术来避免这种浪费。一是内核将每一进程的代码段标记为只读,从而使得父进程和子进程都无法修改代码段。这样,父进程和子进程可以共共享同一代码段。二是对于父进程数据段、堆段和栈段中的各页,内核采用写时复制(copy-on-write) 的方式,这么做的原因之一是:fork之后常常伴随着exec,这会用新程序替换进程的代码段,并重新初始化其数据段、堆段和栈段。但是无论如何,仍存在复制页表的操作,这也是为什么在UNIX(Linux) 下创建进程要比创建线程开销大的原因。

  • 并发量一大,此时系统内便会有存在大量的进程,这会导致CPU花费大量的时间在进程调度上,并且进程上下文的切换开销也很大。

因此,相比于多进程模型,多线程是一个更优的模型:创建线程要快于创建进程,线程间的上下文切换消耗的时间一般也比进程要短。

多线程 Web Server 模型

换用多线程Web Server模型:每accept一个请求,创建一个线程,将请求交由该线程处理。换用多线程模型可以解决由fork带来的开销问题,但是调度问题依然还是存在的。因此,一个显而易见的解决办法是使用线程池,将线程的数量固定下来。基本的实现思路如下。

  • 将每个请求封装为一个Job,每个Job包含线程要执行的方法、传递给线程的参数以及用于描述该Job处于Job队列的位置的参数。

  • 线程池维护着一个Job队列,每个线程从Job队列中取下一个Job执行。因为该Job队列是一个共享资源,因此需要控制线程的同步。

  • 初始化线程池时,马上创建一定数量的线程。此时,这些线程都是阻塞状态的,因为Job队列为空。

代码实现

tinyhttpd是我为了更有效的学习网络编程而实现的一个轻量级的Web Server,目前仍有部分问题需要解决以及优化。按照上面的思路,我实现了一个简单的线程池,并将其引入到tinyhttpd中。具体的代码实现请参考threadpool.h和threadpool.c。

剩余问题

当固定了线程池的线程数量后,仍然存在一个严重的问题:实际情况下,很多连接都是长连接,这意味着一个线程在处理一个请求时,read到的数据将会是是不连续的。当线程处理完一批数据后,如果继续read,而下一批数据还未到来时,由于默认情况下file descriptorblocking的,因此该线程就会进入阻塞状态。所以,如果线程池中所有的线程都处于阻塞状态,此时如果有新的请求到来,那么是无法处理的。

解决方案是将file descriptor设置为non-blocking,利用事件驱动(Event-driven)来处理连接。

参考

  • Linux/UNIX系统编程手册

  • 深入理解计算机系统

  • zaver

arch-linux – Arch Linux 64bit Android ADB?

arch-linux – Arch Linux 64bit Android ADB?

我试图在Arch Linux 64bit上使用Android SDK,但是当我尝试从正确的目录运行ADB时,它说文件不存在,但它就在那里.在你遇到这个问题的Ubuntu上安装ia32-lib但是在Arch Linux中没有.有什么我必须做的.

解决方法:

“无此类文件或目录”消息实际上是指32位可执行文件的加载程序,这是执行32位可执行文件所必需的.有关更详细的说明,请参阅Getting “Not found” message when running a 32-bit binary on a 64-bit system.您需要在Arch Linux上安装32位支持.

遗憾的是,Arch Linux没有一种简单的方法来安装32位支持.目前,您需要通过将这些行添加到pacman.conf来启用[multilib]存储库:

[multilib]
Include = /etc/pacman.d/mirrorlist

有关详细信息,请参阅Wiki上的Arch64 FAQ和Using 32-bit-applications on Arch64.

arch-linux – 在Android设备上启动原生Arch Linux

arch-linux – 在Android设备上启动原生Arch Linux

我有一个galaxy Note 10.1(n8010),我想让它本地启动Arch Linux.我的意思是启动Arch Linux而不是android.我需要的只是改变initramfs,这是我在世界上任何地方都找不到的.我的问题:

>我是否只需要更改initramfs,或者我还需要处理其他事情? (比如内核本身)
> [DONE]我在哪里获得CyanogenMod 10.1的官方initramfs(也许是github)?或者我必须自编译CyanogenMod的内核并从zImage中提取它?
> [可能]我可以在Android数据分区中安装Arch linux root吗? (例如/ data / linux)或者我必须购买SD卡?
>我还需要知道/做什么?

编辑:我发现如何更改initramfs

Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报

Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报

开源吞噬世界的趋势下,借助开源软件,基于开源协议,任何人都可以得到项目的源代码,加以学习、修改,甚至是重新分发。关注「开源日报」,一文速览国内外开源大事件吧!

一分钟速览新闻点!

  • SUSE 为怀念旧 CentOS 的开发者们发布新发行版——Liberty Linux
  • Bootstrap 创始人 Mark otto 谈及自己生病
  • 欧盟委员会开源计划办公室启动漏洞赏金
  • Google 在 Windows 上发布 beta 版本的 Google Play Games app
  • Linux 5.17 使用新的调试功能,便于开发者更能轻松构建内核
  • 基于 Chromium 项目的微软 Edge 浏览器大变更
  • JetBrains 提供面向开发人员的免费开源字体 Mono

开源大新闻

SUSE 为怀念旧 CentOS 的开发者们发布新发行版——Liberty Linux

自从 2020 年红帽宣布终止 CentOS Linux 的支持,并用 CentOS Stream 取而代之后,RHEL 的替代品便相继涌现。知名 Linux 发行套件供应商 SUSE 带来了全新的 SUSE Liberty Linux 产品。据官方介绍,借助 SUSE Liberty Linux,用户可以通过经过验证的可选管理工具获得值得信赖的支持,这些工具针对混合 Linux 环境进行了优化,包括 Red Hat Enterprise Linux 、CentOS 以及用户所期望的 openSUSE 和 SUSE Linux Enterprise Server。而在一定程度上来看,Liberty Linux 等同于当前的 Red Hat 版本——RHEL 8.5 ,并且与来自 Red Hat 自己的 EPEL 存储库的软件包兼容。

Bootstrap 创始人 Mark otto 谈及自己生病

1 月 20 日,Bootstrap 创始人 Mark otto 发文表示,“2021 年 12 月 5 日,我的心脏病发作,在医院住了两个星期。第一周,我在重症监护室里处于医学上的昏迷状态,以冷冻的方式保存我身心。没有人知道当我醒来时,我是否还是我。”

幸运的是,一周之后,Mark otto 苏醒过来,分享道“好消息是我的心脏有一个新支架,而且我恢复得很好。我一直在慢慢地重新使用 Bootstrap 以确保我仍然可以设计和编码(我可以!),现在我会在网上逗留一段时间后下班休息。”同时,他也希望通过此事能够让更多的人关注自己的健康,“多和你的医生交谈、做更多的检查、了解遗传病史、锻炼身体,尽可能地保持安全和健康。虽然这有些陈词滥调,但它可以很好地挽救你的生命。”

Bootstrap是一个基于 HTML、CSS、JavaScript 的简洁灵活的网站前端框架及组件包,它也是 GitHub 上面 star 次数排名第十二的项目。Star 次数超过 155,000。

在这里插入图片描述

欧盟委员会开源计划办公室启动漏洞赏金

欧盟委员会开源计划办公室(EC OSPO)的一组新的漏洞赏金于 1 月 13 日启动,使用 Intigriti 漏洞赏金平台。其中,欧盟委员会开源计划办公室(EC OSPO)总共资助了200,000 欧元,用于再次关注公共服务广泛使用的开源软件的安全性。如在 LibreOffice、LEOS、Mastodon、odoo 和 CryptPad(欧盟公共服务部门使用的开源解决方案)中发现安全漏洞的奖励最高可达 5000 欧元。为他们发现的错误提供代码修复有 20% 的奖金。

Google 在 Windows 上发布 beta 版本的 Google Play Games app

Google 上个月透露要将 Android 游戏带到所有 Windows 平台。现在它正式释出了 beta 版本的 Google Play Games app,目前只对部分地区开放测试。Google 称,Google Play Games app 允许用户在 Windows 台式机或笔记本电脑上浏览、下载和玩部分手游,支持使用键盘和鼠标、在设备之间无缝同步以及与 Google Play Points 集成。该应用暂不支持 Mac。系统要求 Windows 10(v2004),8GB 内存,固态硬盘,20 GB 储存空间,8 核处理器,游戏类显卡(目前市场上的中低端显卡都支持),启用硬件虚拟化。

开源软件专区

Linux 5.17 使用新的调试功能,便于开发者更能轻松构建内核

多年来,Linux 内核支持多种 sanitizers、内存泄漏检测器等功能,这些功能主要用于帮助诊断和解决内核中的缺陷。然而,所有这些调试优化的功能并没有集中在一起,这使系统管理员和开发者在手动配置内核构建时,难以发现这些众多的功能。现在,随着 Linux 5.17 的推出,这种情况正在改变。

Linux 5.17 所做的是引入 debug.config 作为默认的内核构建配置,为调试进行优化。debug.config 将默认启用各种功能,如内核地址消毒器、未定义行为消毒器、KMemLeak,以及许多其他随着时间推移而增加的内核功能,旨在帮助调试或追踪内核问题。因此,只要一个命令,就可以得到官方推荐的内核配置,并启用许多不同的调试功能。

基于 Chromium 项目的微软 Edge 浏览器大变更

近日,微软宣布,从 Edge 96 版本开始,Web 应用将能够在浏览器中使用协议处理程序。最新功能将允许已安装的 Web 应用程序(或 PWA)导航预设或自定义协议。已安装的 Web 应用程序也将能够向操作系统注册为协议处理程序,并在调用特定协议后启动。换句话说,用户可以将网页设置为默认处理程序,比如用户想创建电子邮件,系统将默认打开浏览器中的某个网站。

此外,开发者可以通过注册以 web+ 为前缀的协议来生成 Web 应用程序自定义方案。协议处理程序可用于 Web 应用通信,其中一个应用直接调用另一个应用并通过自定义协议链接传递数据。(小编)

开源工具推荐

JetBrains 提供面向开发人员的免费开源字体 Mono

JetBrains 于近日开源 Mono 字体,其可以作为独立下载提供,并且还被捆绑在所有JetBrains IDE 中。JetBrains Mono 的默认版本带有 OpenType 功能和连字(始终可以在设置中打开和关闭)。如果有开发者的 IDE 不支持 OpenType,也可以使用该字体的特殊版本 — JetBrains Mono NL,其中不包含任何连字。

在这里插入图片描述


《新程序员003》正式上市,50 余位技术专家共同创作,云原生和数字化的开发者们的一本技术精选图书。内容既有发展趋势及方法论结构,华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等 30 多家知名公司云原生和数字化一手实战经验!

订阅地址:https://mall.csdn.net/item/92470?utm_source=csdn_news_group

在这里插入图片描述

总结

以上是小编为你收集整理的Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://blog.csdn.net/csdnopensource/article/details/122615511

c# 线程池实现 只是一个原理性的实现细节内容忽略

c# 线程池实现 只是一个原理性的实现细节内容忽略

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ThreadPoolImp
{
    public class MyThreadExcutor
    {
        //创建
        private static volatile bool RUNNING = true;

        //所有任务都放队列中,让工作线程来消费
        private static ConcurrentQueue<Action> queue = null;

        private static HashSet<Worker> workers = new HashSet<Worker>();

        private static List<Thread> threadList = new List<Thread>();
        //工作线程数
        int poolSize = 0;
        //核心线程数(创建了多少个工作线程)
        int coreSize = 0;

        static bool shutdown = false;
        public MyThreadExcutor(int poolSize)
        {
            this.poolSize = poolSize;
            queue = new ConcurrentQueue<Action>();
        }
        public void Exec(Action action)
        {
            if (action == null) { throw new ArgumentNullException(); }
            if (coreSize < poolSize)
            {
                addThread(action);
            }
            else
            {
                try
                {
                    queue.Enqueue(action);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

        private void addThread(Action action)
        {
            coreSize++;
            Worker worker = new Worker(action);
            workers.Add(worker);
            Thread t = new Thread(worker.Run);
            threadList.Add(t);
            try
            {
                t.Start();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void ShutDown()
        {
            RUNNING = false;
            if (workers.Count > 0)
            {
                foreach (Worker item in workers)
                {
                    item.InterruptAll();
                }
            }
            shutdown = true;
            Thread.CurrentThread.Interrupt();
        }
        class Worker
        {
            private readonly static object lockObj = new object();
            public Worker(Action action)
            {
                queue.Enqueue(action);
            }

            public void Run()
            {
                while (RUNNING)
                {
                    if (shutdown==true)
                    {
                        Thread.CurrentThread.Interrupt();
                    }
                    Action task = null;
                    try
                    {
                        task = GetTask();
                        if (task != null)
                        {
                            task();
                        }
                        else
                        {
                            Thread.CurrentThread.Interrupt();
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }

            public Action GetTask()
            {
                Action result;
                queue.TryDequeue(out result);
                return result;
            }
            public void InterruptAll()
            {
                for (int i = 0; i < threadList.Count; i++)
                {
                    threadList[i].Interrupt();
                }
            }
        }

    }
}

我们今天的关于Linux C 线程池实现linux线程池实现原理的分享就到这里,谢谢您的阅读,如果想了解更多关于arch-linux – Arch Linux 64bit Android ADB?、arch-linux – 在Android设备上启动原生Arch Linux、Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报、c# 线程池实现 只是一个原理性的实现细节内容忽略的相关信息,可以在本站进行搜索。

本文标签: